import { mergeLocalCartApi, getCartListApi, addCartApi, delGoodApi, updateCartApi, checkAllApi } from '@/api/cart'

// 购物车状态
export default {
  namespaced: true,
  state: () => ({
    list: []
  }),
  getters: {
    /**
     * 有效商品列表 -> 无效商品(没库存或下架了)
     * 选中的购物车商品数据
     * 选中的商品总价
     * 购物车中有效商品是否是全部选中状态
     * @param {} state
     * @returns
     */
    // 有效商品列表
    validList: state => state.list.filter(item => item.isEffective),
    // 选中的购物车商品数据
    // 注意点 -> 即使不使用过state也要带上state,形参要占位,否则getters无法使用,会报错
    selectedList: (state, getters) => getters.validList.filter(item => item.selected),
    // 选中的商品总价
    selectedPrice: (state, getters) => getters.selectedList.reduce((acc, cur) => (acc += cur.count * cur.nowPrice), 0),
    // 是否是全部选中状态
    isAll: (state, getters) => getters.validList.every(item => item.selected),
    // 选中的有效商品的总数量
    allSelectedCount: (state, getters) => getters.selectedList.reduce((acc, cur) => (acc += cur.count), 0)
  },
  mutations: {
    // 修改购物车
    setCart (state, good) {
      /**
       * 将sku选择的商品unshift到list?
       * 不行->需要进行排重
       * 思路: 根据skuId判断之前是否加入过
       * 1.加入过 -> 累加数量
       * 2.没加啊如果 -> unshift到list
       */
      const sameIndex = state.list.findIndex(item => item.skuId === good.skuId)
      console.log('当前商品数据', good)
      console.log('购物车列表数据', state.list)
      if (sameIndex > -1) {
        // 有相同的商品累加数量
        state.list[sameIndex].count = state.list[sameIndex].count + good.count
      } else {
        // 没有相同的商品,则新增
        state.list.unshift(good)
      }
    },
    // 商品单选
    /**
     *
     * @param {*} state
     * @param {*} param1 {good 当前选择的商品, selected选中状态}
     */
    singleCheck (state, { good, selected }) {
      /**
       * 1.根据good找到单选商品
       * 2.修改找到商品的选中状态
      */
      const curretGood = state.list.find(item => item.skuId === good.skuId)
      curretGood.selected = selected
    },
    // 全选
    allCheck (state, selected) {
      state.list.forEach(item => {
        item.selected = selected
      })
    },
    // 删除
    delGood (state, good) {
      /**
       * 根据good找到要删除的商品的索引值
       * 通过splice(index,1)删除
       */
      const index = state.list.findIndex(item => item.skuId === good.skuId)
      state.list.splice(index, 1)
    },
    // 修改数量
    changeCount (state, { good, count }) {
      const currentGood = state.list.find(item => item.skuId === good.skuId)
      currentGood.count = count
    },
    // 保存购物车数据
    setCartList (state, carList) {
      state.list = carList
    }
  },
  actions: {
    /**
     * 加入购物车action
     * 思路: 区分是否登录 -> 1.未登录,直接调用addCart存到本地
     * 2.已登录,调用接口存到数据库
     * @param {} param rootState获取其他模块的state变量
     * @param {*} good 商品数据
     * @return Promise对象
     */
    async addCart ({ commit, rootState, dispatch }, good) {
      if (rootState.user.profile.token) {
        // 已登录
        // console.log(rootState.user.profile.token)
        await addCartApi(good)
        await dispatch('getCartListAction')
        return '加入购物车成功'
      } else {
        commit('setCart', good)
        return '加入购物车成功'
      }
    },
    // 单选
    async singleCheckAction ({ commit, rootState, dispatch }, { good, selected }) {
      if (rootState.user.profile.token) {
        // 已登录 -> 调用接口存到数据库
        // console.log(rootState.user.profile.token)
        await updateCartApi({ ...good, selected: selected })
        await dispatch('getCartListAction')
      } else {
        // 未登录
        commit('singleCheck', { good, selected })
      }
    },
    // 全选
    async allCheckAction ({ commit, rootState, getters, dispatch }, selected) {
      if (rootState.user.profile.token) {
        // 已登录 -> 调用接口存到数据库
        const ids = getters.validList.map(item => item.skuId)
        await checkAllApi({ selected: selected, ids: ids })
        await dispatch('getCartListAction')
      } else {
        // 未登录 -> 存到本地
        commit('allCheck', selected)
      }
    },
    // 删除
    async delGoodAction ({ commit, rootState, dispatch }, good) {
      if (rootState.user.profile.token) {
        // 已登录 -> 调用接口存到数据库
        await delGoodApi([good.skuId])
        await dispatch('getCartListAction')
      } else {
        // 未登录 -> 存到本地
        commit('delGood', good)
      }
    },
    // 修改数量
    async changeCountAction ({ commit, rootState, dispatch }, { good, count }) {
      if (rootState.user.profile.token) {
        // 已登录 -> 调用接口存到数据库
        await updateCartApi({ ...good, count: count })
        await dispatch('getCartListAction')
      } else {
        // 未登录 -> 存到本地
        commit('changeCount', { good, count })
      }
    },
    // 合并购物车
    /**
     * 登录成功后合并本地购物车数据到当前登录人名下
     * @param {} param0
     */
    async mergeLocalCart ({ state, dispatch }) {
      /**
       * 1.判断本地是否有之前未登录添加的购物车数据
       * 2.如果有调用接口进行合并
       * 3.调用接口获取合并或最新的购物车数据(属于当前登录人的购物车数据)
       */
      if (state.list.length) {
        // mergeData=[{skuId, selected, ount}]
        const mergeData = state.list.map(({ skuId, selected, count }) => {
          return { skuId, selected, count }
        })
        await mergeLocalCartApi(mergeData)
      }
      // 调用接口获取最新购物车数据
      // 说明 即使本地没有，也要获取当前登录人最新的购物车列表数据
      await dispatch('getCartListAction')
    },
    // 获取最新购物车数据
    async getCartListAction ({ commit }) {
      const { result } = await getCartListApi()
      commit('setCartList', result)
    }
  }
}
